

/**
 * <p>Title: LoginSvc</p>
 * <p>Description: The Interface of LoginSvc</p>
 * <p>Copyright: Shanghai Batchsight Pharmaceutical Technologies, Inc. Copyright(c) 2016</p>
 * @author 
 * @version 1.0
 * <pre>Histroy:
 *       2016-9-29    Create
 *</pre>
*/
package cn.jhg.account.service;

import java.sql.Timestamp;

import cn.jhg.account.entity.User;
import cn.jhg.account.util.ServiceResult;

/**
 * LoginSvc 接口提供用户密码管理、登录、验证登录信息服务
 * @author 
 */
public interface LoginSvc {
	/**
	 * 用户登录操作
	 * @param account	账号
	 * @param password	密码
	 * @return	错误代码, 验证码（如果登录成功）
	 */
	public ServiceResult<User> login(String account, String password);
	// 验证传入的账号与密码是否存在，验证账号状态是否可用， 验证用户密码有效期
	// 登录成功后系统生成一个随机的验证码返回用户，后续操作中使用该验证码进行用户权限验证
	// 调用审计追踪模块，记录本次登录信息（包括登录成功及不成功）
	// - 正常状态允许登录
	// - 锁定、失效状态不能登录
	// - 初始、重置状态不能登陆，需要先修改密码

	/**
	 * 用户登出
	 * @param uid	User Id
	 * @param iuid	调用者 id
	 * @return 错误代码
	 */
	public ServiceResult<Object> logout(int uid, int iuid);
	// 删除系统中保存的验证码，记录审计追踪信息

	/**
	 * 修改密码
	 * @param uid		User Id
	 * @param oldPwd	旧密码
	 * @param newPwd	新密码
	 * @param iuid	调用者 id
	 * @return	错误代码
	 */
	public ServiceResult<Object> changePassword(String account, String oldPwd, String newPwd);
	// 此方法仅用于修改本人的密码
	// 暂定当前日期加一个月
	// 修改数据库中的用户密码，记录审计追踪信息

	/**
	 * 重置密码
	 * @param uid	User Id
	 * @param sid   签名 id（操作前用户确认签名记录的 id）
	 * @param iuid	调用者 id
	 * @return	错误代码, 新密码
	 */
	public ServiceResult<String> resetPassword(int uid, int sid, int iuid);
	// 此方法由管理员调用
	// 为用户随机生成一个新的密码（密码必须至少6位以上并且至少同时含有数字和字母）
	// 密码以 SHA-256 算法加密后存入数据库
	// 将用户密码有效期修改为当前时间
	// 将用户状态置为“重置”
	// 记录审计追踪信息

	/**
	 * 锁定用户
	 * @param uid	User Id
	 * @param iuid	调用者 id
	 * @param sid   签名 id（操作前用户确认签名记录的 id）
	 * @return	错误代码
	 */
	public ServiceResult<Object> lockAccount(int uid, int sid, int iuid);
	// 将用户状态置为锁定（按位或）
	// 记录审计追踪信息

	/**
	 * 解锁用户
	 * @param uid	User Id
	 * @param sid   签名 id（操作前用户确认签名记录的 id）
	 * @param iuid	调用者 id
	 * @return	错误代码
	 */
	public ServiceResult<Object> unlockAccount(int uid, int sid, int iuid);
	// 将用户状态置为非锁定（按位与）
	// 记录审计追踪信息

	/**
	 * 获取密码有效期
	 * @param uid	User Id
	 * @return	错误代码，有效期
	 */
	public ServiceResult<Timestamp> getPwdExpiryDate(int uid);

	/**
	 * 查询当前登录的用户	 Id
	 * @param auth	验证码
	 * @return	错误代码，User Id
	 */
	public ServiceResult<Integer> queryAuthenticatedUser(String auth);
	// 根据登录验证码查询当前登录用户的 id
}
